﻿/*
 * Created by SharpDevelop.
 * User: lpelegrini
 * Date: 23/06/2013
 * Time: 13:23
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Common;
using System.Data;
using MySql.Data.MySqlClient;

namespace Fazenda.DAL
{
	///
	/// Classe de configuração da Conexão com o BD
	///
	public static class ConnectionDB
	{
		///
		/// Construtor Default
		///
		static ConnectionDB()
		{
			try
			{
				// Recebe do arquivo de configuração Web.Config a string de conexão e o nome do provedor
				connectionString = "Server=127.0.0.1;Port=3306;Database=fazendamisu;Uid=fazenda;Pwd=fazendamisu;";//ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
				providerName = "MySql.Data.MySqlClient";//ConfigurationManager.ConnectionStrings["ConnectionString"].ProviderName;
			}
			catch (Exception ex)
			{
				throw ex;//new Exception("Erro ao receber dados da Conexão. Por favor verifique se a string de conexão está declarada corretamente.",ex);
			}
		}
		
		///
		/// Field String de Conexão
		///
		private static string connectionString;
		
		///
		/// Field Nome do Provedor
		///
		private static string providerName;
		
		///
		/// Propriedade que apenas informa a String de Conexão
		///
		public static string ConnectionString
		{
			get
			{
				return connectionString;
			}
		}
		
		///
		/// Propriedade que apenas informa o Nome do Provedor
		///
		public static string ProviderName
		{
			get
			{
				return providerName;
			}
		}
		
		///
		/// Método que Cria um objeto DBCommand com os dados
		/// da classe ConnectionDB utilizando Factory
		///
		/// DBCommand criado
		public static MySqlCommand createCommand(String cmmdText, CommandType cmmdType, List<DbParameter> listParameter)
		{
			try
			{
				// Cria um novo factories de acordo com o nome do provedor
				//DbProviderFactory factory = DbProviderFactories.GetFactory(ConnectionDB.ProviderName);
				
				// Cria um objeto específico de conexão de acordo com o nome do provedor
				//MySqlConnection conn =  factory.CreateConnection();
				
				// Atribui a String de Conexão
				//conn.ConnectionString = ConnectionDB.ConnectionString;
				MySqlConnection conn =  new MySqlConnection(ConnectionDB.ConnectionString);
				
				// Cria um objeto command específico de acordo com o nome do provedor
				MySqlCommand comm = conn.CreateCommand();
				
				// Atribui o comando Text
				comm.CommandText = cmmdText;
				// Atribui o tipo de comando
				comm.CommandType = cmmdType;
				
				// Se existir algum parâmetro ele adiciona
				// ao comando
				if (listParameter != null)
				{
					foreach (DbParameter param in listParameter)
					{
						// Adicionando o parâmetro
						comm.Parameters.Add(param);
					}
				}
				// Retorna o comando criado
				return comm;
			}
			catch (Exception ex)
			{
				throw new Exception("Erro ao receber dados da Conexão. Por favor verifique se a string de conexão está declarada corretamente.", ex);
			}

		}
		
		///
		/// Método responsável por criar um Parâmetro
		///
		///         List param = new List();
		///         param.Add(criaParameter(nome, tipo, valor));
		///
		///
		/// Nome do Parâmetro
		/// Tipo do Parâmetro
		/// Valor do Parâmetro
		/// Parâmetro preenchido
		public static DbParameter createParameter(String nameParameter, DbType typeParameter, Object valueParameter)
		{
			try
			{
				// Cria um novo factories de acordo com o nome do provedor
				DbProviderFactory factory = DbProviderFactories.GetFactory(ConnectionDB.ProviderName);
				
				// Cria o Parâmetro e add seu valores
				DbParameter param = factory.CreateParameter();
				param.ParameterName = nameParameter;
				param.DbType = typeParameter;
				param.Value = valueParameter;
				// Retorna o Parâmetro criado
				return param;
			}
			catch (Exception ex)
			{
				throw new Exception("Erro ao receber dados da Conexão. Por favor verifique se a string de conexão está declarada corretamente.", ex);
			}

		}
		
		
		///
		/// Método que cria um comando e executa esse comando.
		///
		/// String SQL ou StoredProcedure
		/// Tipo de Commando (Text ou Stored Procedure
		/// Lista de parâmetros
		/// Comando a ser executado (ExecuteNonQuery, ExecuteReader, ExecuteScalar, ExecuteDataTable)
		/// Object
		public static Object executeCommand(String cmmdText, CommandType cmmdType, List<DbParameter> listParameter, TypeCommand typeCmmd)
		{
			// Cria comando com os dados passado por parâmetro
			MySqlCommand command = createCommand(cmmdText, cmmdType, listParameter);
			
			// Cria objeto de retorno
			Object objRetorno = null;
			
			try
			{
				// Abre a Conexão com o banco de dados
				command.Connection.Open();
				
				switch (typeCmmd)
				{
					case TypeCommand.ExecuteNonQuery:
						// Retorna o número de linhas afetadas
						objRetorno = command.ExecuteNonQuery();
						break;
					case TypeCommand.ExecuteReader:
						// Retorna um DbDataReader
						objRetorno = command.ExecuteReader(CommandBehavior.CloseConnection);
						break;
					case TypeCommand.ExecuteScalar:
						// Retorna um objeto
						objRetorno = command.ExecuteScalar();
						break;
					case TypeCommand.ExecuteDataTable:
						// Cria uma tabela
						DataTable table = new DataTable();
						// Executa o comando e salva os dados na tabela
						DbDataReader reader = command.ExecuteReader();
						table.Load(reader);
						// Fecha o Reader
						reader.Close();
						// Retorna a tabela
						objRetorno = table;
						break;
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
			finally
			{
				if (typeCmmd != TypeCommand.ExecuteReader)
				{
					// Sempre fecha a conexão com o BD
					command.Connection.Close();
				}
			}
			
			return objRetorno;
		}
	}
}
